<?php
declare(strict_types=1);

namespace SixShop\MakerBundle\Generator;

use Symfony\Component\Console\Style\SymfonyStyle;

class GitignoreGenerator
{
    private string $templatePath;

    public function __construct()
    {
        $this->templatePath = __DIR__ . '/../../templates/.gitignore.tpl.php';
    }

    /**
     * 生成.gitignore内容
     */
    public function generateContent(): string
    {
        if (!file_exists($this->templatePath)) {
            throw new \RuntimeException('模板文件不存在: ' . $this->templatePath);
        }

        // 生成.gitignore内容
        ob_start();
        include $this->templatePath;
        return ob_get_clean();
    }

    /**
     * 保存.gitignore文件到指定目录
     */
    public function saveGitignoreFile(string $packageName, string $content, string $targetPath, SymfonyStyle $io): bool
    {
        $extensionDir = $targetPath;

        // 确保目录存在
        if (!is_dir($extensionDir)) {
            if (!mkdir($extensionDir, 0755, true)) {
                $io->error('无法创建目录: ' . $extensionDir);
                return false;
            }
        }

        $outputPath = $extensionDir . '/.gitignore';
        if (file_put_contents($outputPath, $content) !== false) {
            $io->success('.gitignore 文件已成功生成: ' . $outputPath);
            return true;
        } else {
            $io->error('无法写入文件: ' . $outputPath);
            return false;
        }
    }

    /**
     * 完整的生成和保存流程
     */
    public function createGitignore(string $packageName, string $targetPath, SymfonyStyle $io): bool
    {
        try {
            // 生成内容
            $content = $this->generateContent();

            // 输出生成的内容
            $io->section('生成的 .gitignore 内容:');
            $io->text($content);

            // 询问是否保存文件
            if ($io->confirm('是否将内容保存到 .gitignore 文件?', true)) {
                return $this->saveGitignoreFile($packageName, $content, $targetPath, $io);
            }

            return true;
        } catch (\Exception $e) {
            $io->error('生成 .gitignore 时发生错误: ' . $e->getMessage());
            return false;
        }
    }
}